#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
根据bcur_2025.csv中的rank和slug重命名logo2目录中的图片文件

该脚本用于规范化大学logo图片的文件名，使其符合"排名_slug.扩展名"的格式。
例如：1_tsinghua-university.jpg, 2_peking-university.png 等。

使用方法：
1. 确保bcur_2025.csv文件和logo2目录在同一目录下
2. 运行脚本：python rename_logo2_files.py
3. 脚本会自动重命名logo2目录中的所有图片文件

依赖：
- Python 3.x
- 标准库：os, csv, re
"""

import os
import csv
import re

# CSV文件路径和logo目录名
CSV_FILE = "bcur_2025.csv"
LOGO2_DIR = "logo2"

def clean_name(name):
    """
    清理大学名称，移除括号及其内容，特殊字符等
    
    Args:
        name (str): 原始大学名称
        
    Returns:
        str: 清理后的大学名称
    """
    # 移除括号及其内容，例如"中国石油大学（北京）"变为"中国石油大学"
    name = re.sub(r'\(.*?\)', '', name)
    # 移除特殊字符，只保留中文、英文、数字和空格
    name = re.sub(r'[^\w\s\u4e00-\u9fff]', '', name)
    # 移除多余空格并去除首尾空格
    name = re.sub(r'\s+', ' ', name).strip()
    return name

def read_csv_data():
    """
    读取CSV文件中的rank, name_cn, slug信息
    
    Returns:
        dict: 以清理后的大学名称为键，包含排名和slug信息的字典为值的字典
              格式：{'清华大学': {'rank': '1', 'slug': 'tsinghua-university', 'name_cn': '清华大学'}}
    """
    university_data = {}
    # 使用utf-8-sig编码处理可能存在的BOM
    with open(CSV_FILE, 'r', encoding='utf-8-sig') as f:
        reader = csv.reader(f)
        next(reader)  # 跳过标题行
        for row in reader:
            # 从CSV中提取所需字段
            rank = row[0]      # 排名
            name_cn = row[1]   # 中文名称
            slug = row[3]      # slug
            
            # 清理名称以便匹配
            clean_name_cn = clean_name(name_cn)
            
            # 存储数据到字典中
            university_data[clean_name_cn] = {
                'rank': rank,
                'slug': slug,
                'name_cn': name_cn
            }
    
    return university_data

def rename_logo_files():
    """
    根据CSV数据重命名logo2目录中的文件
    
    该函数会遍历logo2目录中的所有图片文件，根据文件名中的大学名称
    匹配CSV中的数据，并将文件重命名为"排名_slug.扩展名"的格式。
    """
    # 读取CSV数据
    university_data = read_csv_data()
    
    # 检查logo2目录是否存在
    if not os.path.exists(LOGO2_DIR):
        print(f"目录 {LOGO2_DIR} 不存在")
        return
    
    # 统计重命名结果
    renamed_count = 0
    failed_count = 0
    
    # 遍历logo2目录中的所有文件
    for filename in os.listdir(LOGO2_DIR):
        # 只处理图片文件
        if filename.endswith(('.jpg', '.png', '.jpeg', '.gif', '.bmp')):
            # 提取文件名中的大学名称部分
            # 例如："university_清华大学.jpg" -> "清华大学"
            name_part = filename.replace('university_', '').rsplit('.', 1)[0]
            
            # 查找匹配的大学数据
            matched_university = None
            for university_name, data in university_data.items():
                clean_university_name = clean_name(university_name)
                # 如果清理后的名称匹配，则认为找到对应数据
                if clean_university_name == name_part:
                    matched_university = data
                    matched_university['clean_name'] = clean_university_name
                    break
            
            # 如果找到匹配的大学数据
            if matched_university:
                # 构造新的文件名
                rank = matched_university['rank']
                slug = matched_university['slug']
                
                # 处理slug中的特殊字符，确保文件名合法
                safe_slug = re.sub(r'[^\w\-]', '-', slug)
                
                # 获取文件扩展名
                extension = filename.rsplit('.', 1)[1]
                # 构造新文件名：排名_slug.扩展名
                new_filename = f"{rank}_{safe_slug}.{extension}"
                new_filepath = os.path.join(LOGO2_DIR, new_filename)
                old_filepath = os.path.join(LOGO2_DIR, filename)
                
                # 重命名文件
                try:
                    os.rename(old_filepath, new_filepath)
                    print(f"重命名: {filename} -> {new_filename}")
                    renamed_count += 1
                except Exception as e:
                    print(f"重命名失败 {filename}: {e}")
                    failed_count += 1
            else:
                print(f"未找到匹配的大学数据: {filename}")
                failed_count += 1
    
    # 输出重命名结果统计
    print(f"重命名完成。成功: {renamed_count} 个文件，失败: {failed_count} 个文件")

def main():
    """
    主函数：执行重命名操作
    """
    print("开始重命名logo2目录中的文件...")
    rename_logo_files()
    print("重命名操作完成")

# 程序入口点
if __name__ == "__main__":
    main()